package com.hans.scala

/**
 * 闭包 => 可以包含自由（未绑定到特定对象）变量的代码块
 * 子函数可以使用父函数中的局部变量，这种行为就叫做闭包
 *
 */
object ClosureExample {
  def main(args: Array[String]) {
    //理解闭包
    class addMoreVersion1(mare: Int) {
      def add(x: Int) {
        x + mare
      }
    }
    val obj = new addMoreVersion1(1)
    val add1 = obj.add _ //偏应用函数
    println(add1(1))

    //闭包 => 每次函数被调用都会创建一个新的闭包
    def addMoreVersion2(mare: Int) = (x: Int) => x + mare //匿名函数 (x: Int) => x + mare
    val add2 = addMoreVersion2(2)
    val add4 = addMoreVersion2(4)
    add2(1)
    add4(1)
    add2(1)


    def _add2(x: Int) {
      x + 2
    }
    println(add2(1))

    //curry化
    def addMoreVersion3(mare: Int)(x: Int) = x + mare

    val add3 = addMoreVersion3(3)_
    print(add3(1))
  }
}
